home *** CD-ROM | disk | FTP | other *** search
- extern char xstr[];
- #line 1 "printf.c"
-
-
-
-
-
-
-
- static char *sccsid = (&xstr[8789]);
-
- static char *printf_id = (&xstr[8849]);
-
-
- #line 1 "/usr/include/varargs.h" 1
-
-
- typedef char *va_list;
-
-
-
-
-
-
-
- #line 14 "printf.c" 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- static int width, sign, fill;
-
- char *_p_dconv();
-
-
- ex_printf(__builtin_va_alist)
- int __builtin_va_alist;
- {
- va_list ap;
- register char *fmt;
- char fcode;
- int prec;
- int length,mask1,nbits,n;
- long int mask2, num;
- register char *bptr;
- char *ptr;
- char buf[134];
-
- ap = (char *) &__builtin_va_alist;
- fmt = ((char * *)(ap += sizeof(char *)))[-1];
- for (;;) {
-
- while ((fcode = *fmt++)!='%') {
-
- if (fcode=='\0')
- return;
- ex_putchar(fcode);
- }
-
- length = 0;
-
- sign = 0;
- if (*fmt == '-') {
- sign++;
- fmt++;
- }
-
-
- fill = 1;
- if (*fmt == '0') {
- fill--;
- fmt++;
- }
-
-
- if (*fmt == '*') {
- width = (( int *)(ap += sizeof( int)))[-1];
- if (width < 0) {
- width = -width;
- sign = !sign;
- }
- fmt++;
- }
- else {
- width = 0;
- while (*fmt>='0' && *fmt<='9')
- width = width * 10 + (*fmt++ - '0');
- }
-
-
- if (*fmt=='.') {
- if (*++fmt == '*') {
- prec = (( int *)(ap += sizeof( int)))[-1];
- fmt++;
- }
- else {
- prec = 0;
- while (*fmt>='0' && *fmt<='9')
- prec = prec * 10 + (*fmt++ - '0');
- }
- }
- else
- prec = -1;
-
-
-
-
-
-
-
-
-
-
-
- switch (*fmt) {
- case 'L':
- case 'l':
- length = 2;
-
- case 'h':
- case 'H':
- length--;
- fmt++;
- break;
- }
-
-
-
-
-
-
- switch (fcode = *fmt++) {
-
- case 'c':
- buf[0] = (( int *)(ap += sizeof( int)))[-1];
- ptr = bptr = &buf[0];
- if (buf[0] != '\0')
- ptr++;
- break;
- case 's':
- bptr = ((char * *)(ap += sizeof(char *)))[-1];
- if (bptr==0)
- bptr = (&xstr[8874]);
- if (prec < 0)
- prec = 32767;
- for (n=0; *bptr++ && n < prec; n++) ;
- ptr = --bptr;
- bptr -= n;
- break;
- case 'O':
- length = 1;
- fcode = 'o';
-
- case 'o':
- case 'X':
- case 'x':
- if (length > 0)
- num = ((long *)(ap += sizeof(long)))[-1];
- else
- num = (unsigned)((int *)(ap += sizeof(int)))[-1];
- if (fcode=='o') {
- mask1 = 0x7;
- mask2 = 0x1fffffffL;
- nbits = 3;
- }
- else {
- mask1 = 0xf;
- mask2 = 0x0fffffffL;
- nbits = 4;
- }
- n = (num!=0);
- bptr = buf + 11 + 3;
-
- do
- if (((int) num & mask1) < 10)
- *--bptr = ((int) num & mask1) + 060;
- else
- *--bptr = ((int) num & mask1) + 0127;
- while (num = (num >> nbits) & mask2);
-
- if (fcode=='o') {
- if (n)
- *--bptr = '0';
- }
- else
- if (!sign && fill <= 0) {
- ex_putchar('0');
- ex_putchar(fcode);
- width -= 2;
- }
- else {
- *--bptr = fcode;
- *--bptr = '0';
- }
- ptr = buf + 11 + 3;
- break;
- case 'D':
- case 'U':
- case 'I':
- length = 1;
- fcode = fcode + 'a' - 'A';
-
- case 'd':
- case 'i':
- case 'u':
- if (length > 0)
- num = ((long *)(ap += sizeof(long)))[-1];
- else {
- n = ((int *)(ap += sizeof(int)))[-1];
- if (fcode=='u')
- num = (unsigned) n;
- else
- num = (long) n;
- }
- if (n = (fcode != 'u' && num < 0))
- num = -num;
-
- bptr = _p_dconv(num, buf);
- if (n)
- *--bptr = '-';
- if (fill == 0)
- fill = -1;
- ptr = buf + 10 + 1;
- break;
- default:
-
-
-
- ptr = bptr = &fcode;
- ptr++;
- break;
- }
- if (fcode != '\0')
- _p_emit(bptr,ptr);
- }
- ;
- }
-
-
-
-
-
-
-
-
-
-
-
- char *
- _p_dconv(value, buffer)
- long value;
- char *buffer;
- {
- register char *bp;
- register int svalue;
- int n;
- long lval;
-
- bp = buffer;
-
-
- if (value == 0) {
- bp += 10;
- *bp = '0';
- return(bp);
- }
-
-
- n = 0;
- while (value < 0) {
- value -= 1000000000;
- n++;
- }
- while ((lval = value - 1000000000) >= 0) {
- value = lval;
- n++;
- }
-
-
- bp[1] = n + '0';
-
-
-
-
-
-
- bp += 10 + 1;
- while (value > 32767) {
- *--bp = (int)(value % 10) + '0';
- value /= 10;
- }
-
-
- svalue = value;
- while (svalue > 0) {
- *--bp = (svalue % 10) + '0';
- svalue /= 10;
- }
-
-
- if (buffer[1] != '0') {
- while (bp > buffer + 2)
- *--bp = '0';
- --bp;
- }
- return(bp);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- _p_emit(s, send)
- register char *s;
- char *send;
- {
- char cfill;
- register int alen;
- int npad;
-
- alen = send - s;
- if (alen > width)
- width = alen;
- cfill = fill>0? ' ': '0';
-
-
- if (*s == '-' && fill < 0) {
- ex_putchar(*s++);
- alen--;
- width--;
- }
- npad = width - alen;
-
-
- if (!sign)
- while (--npad >= 0)
- ex_putchar(cfill);
-
-
- while (--alen >= 0)
- ex_putchar(*s++);
-
-
- if (sign)
- while (--npad >= 0)
- ex_putchar(cfill);
- }
-